package com.xlh.service.courseTest;

import com.xlh.dto.courseTest.AnswerSheetDTO;
import com.xlh.dto.courseTest.AnswerSheetTypeDTO;
import com.xlh.dto.courseTest.TypeReadingDTO;
import com.xlh.dto.courseTest.check.ChapterCountDTO;
import com.xlh.dto.courseTest.check.ClassUncheckedCountDTO;
import com.xlh.dto.courseTest.check.StudentBaseListDTO;
import com.xlh.dto.courseTest.check.StudentListDTO;
import com.xlh.dto.courseTest.practice.*;
import com.xlh.enums.courseTest.PaperStatusEnum;
import com.xlh.param.check.CheckSubmitParam;
import com.xlh.param.courseTest.PracticeGetParam;
import com.xlh.pojo.courseTest.Practice;

import java.util.List;
import java.util.Map;

/**
 * @author zhr 2019/4/1
 */
public interface PracticeService {
    /**
     * <p>向缓存中注入数据</p>
     */
    void putCache(PracticeGetParam param, List<AnswerSheetDTO> answerSheetInfo);

    /**
     * <p>查询缓存记录,若缓存中没有记录,则向缓存中注入新数据</p>
     */
    List<AnswerSheetDTO> getCache(PracticeGetParam param);

    /**
     * <p>显式移除缓存中的数据</p>
     */
    void removeCache(PracticeGetParam param);

    /**
     * @return 随堂练习页面数据以及当前用户的答题列表
     */
    PracticeDTO getPractice(Long chapterId, Long questionId, Long userId, Boolean isTeacher, Long courseId);
    PracticeDTO getPracticeOther(Long chapterId, Long questionId, List<Long> questionIds, Boolean isTeacher, Long courseId);
    /**
     * 上传学生的答题结果
     */
    void submitPractice(Long chapterId, List<AnswerSheetTypeDTO> answerSheetTypeList, Long userId, Long courseId);

    /**
     * 插入数据，未设置的内容将插入默认值
     *
     * @return
     */
    void insertSelective(Long chapterId, Long userClassId, List<AnswerSheetTypeDTO> answerSheetTypeList);

    /**
     * 分类章节id查询每章节提交汇总情况
     */
    List<ChapterCountDTO> countGroupByChapterIdClassId(List<Long> chapterIds);

    /**
     * 通过主键id查询学生随堂练习情况
     */
    Practice selectByPrimaryKey(Long id);

    /**
     * 通过章节id列表删除随堂练习
     */
    void deletePractice(List<Long> chapterIds);

    /**
     * 按照用户id,章节id删除随堂练习
     */
    void deletePractice(List<Long> userIds, List<Long> chapterIds);

    /**
     * 查询某班某章节的随堂练习提交情况
     */
    List<Practice> selectByChapterIdStudentIds(Long chapterId, List<Long> students);

    /**
     * 是否已经提交
     */
    Boolean isSubmitted(Long chapterId, Long userId, Long courseId);

    /**
     * 获取批阅的详情
     * @return
     */
    List<TypeReadingDTO> getDetails(Practice practice);

    /**
     * 按照主键进行修改
     */
    void updateByPrimaryKey(Practice practice);

    List<StudentListDTO> listStudent(Long classId, Long chapterId, Integer status, String studentInfo, Long userId);

    /**
     * 用户已提交的随堂练习次数
     * @param userId
     */
    Long getCount(Long userId);

    /**
     * 获取用户各章节随堂练习提交批阅情况
     */
    Map<Long, PaperStatusEnum> getChapterPracticeMap(List<Long> chapterIds, Long courseId);

    List<StudentBaseListDTO> listStudentBase(Long courseId, Long userId);
    List<StudentListDTO> listStudentBaseOther(Long userId, Long courseId, Long chapterId, Long classId);
    /**
     * 保存并归档pdf
     * @param fileName
     * @param param
     */
    void updatePDF(String fileName, CheckSubmitParam param);

    List<Practice> selectByChapterIdsClassId(List<Long> chapterIds, Long classId);

    /**
     * 查询:过滤掉blob
     * @param chapterIds
     * @return
     */
    List<Practice> selectByChapterIdsWithoutBlobs(List<Long> chapterIds);

    List<ClassUncheckedCountDTO> selectUncheckedByCourseIds(List<Long> courseIdList);

    /**
     * 保存当前随堂练习答题情况
     * @param chapterId 章节id
     * @param answerSheetTypeList 答题详情
     * @param userId 用户id
     * @param courseId 课程id
     */
    void savePractice(Long chapterId, List<AnswerSheetTypeDTO> answerSheetTypeList, Long userId, Long courseId);

    /**
     * 根据章节ID查询随堂练习统计情况
     * @param classId
     * @param chapterId
     * @return
     */
    PracticeChapterDTO chapterStatistics(Long chapterId, Long classId);


    /**
     * 表：practice
     * 目的：查询每个学生的各个章节的随堂练习情况
     * 参数：List<Long> chapterIds 、 List<Long> userIds
     * 返回值：List<随堂练习对象> 必须包含：提交状态、评分、章节id、userId
     */
    List<PrictceCourseStatisticsDTO> findPracticeByChapterIdsAndUserIds(List<Long> chapterIds, List<Long> userIds );


    PracticeAccuracyTypeWrapDTO accuracyStatistics(Long chapterId, Long defaultClassId);
}
